﻿using SuperSocket.Facility.Protocol;//
using SuperSocket.Common;
using SuperSocket.SocketBase.Protocol;
using System;//

namespace TcpServer.SouthGridServer
{
    /// <summary>
    /// 南网规约过滤器(帧格式为BinaryRequestInfo)
    /// 起始字符（ 68H） ↑
    ///长度 L 固定长度
    ///长度 L 的报文头
    ///起始字符（ 68H） ↓
    ///控制域 C 控制域 用户
    ///数据区
    ///地址域 A 地址域
    ///4
    ///链路用户数据 链路用户数据
    ///（应用层）
    ///校验和 CS 帧校验和
    ///结束字符（ 16H）
    /// </summary>
    public class SouthGridProtocolReceiveFilter : FixedHeaderReceiveFilter<BinaryRequestInfo>
    {
        public SouthGridProtocolReceiveFilter()
            : base(6)
        {
            //68+L+L+68 起始6个字节
        }


        protected override int GetBodyLengthFromHeader(byte[] header, int offset, int length)
        {
            //length为base(6)的6
            //获取高位
            byte high = header[offset + length - 2];
            //获取低位
            byte low = header[offset + length - 3];
            int len = (int)high * 256 + low;
            return len + 2;//结尾有2个字节(CS和16)
        }

        protected override BinaryRequestInfo ResolveRequestInfo(ArraySegment<byte> header, byte[] bodyBuffer, int offset, int length)
        {
            BinaryRequestInfo res = new BinaryRequestInfo(BytesToHexStr(header.Array), bodyBuffer.CloneRange(offset, length));
            return res;
        }

        /// <summary>
        /// 转化bytes成16进制的字符
        /// </summary>
        /// <param name="bytes"></param>
        /// <returns></returns>
        private string BytesToHexStr(byte[] bytes)
        {
            string returnStr = "";
            if (bytes != null)
            {
                for (int i = 0; i < bytes.Length; i++)
                {
                    returnStr += bytes[i].ToString("X2");
                }
            }
            return returnStr;
        }
    }
}
